package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;

/**
 * 评价实体类
 *
 * 用于存储用户对商品、菜品、任务等的评价信息，包括：
 * - 评价内容、评分、评价人等
 * - 业务类型区分（菜品、旧物、任务）
 * - 关联用户信息、业务信息
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("评价")
@TableName(autoResultMap = true)
public class Review {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 用户ID
	 * 评价发布者，自动填充当前用户ID
	 * 关联User表
	 */
	@ApiModelProperty("用户ID")
	@TableField(fill = FieldFill.INSERT)
	@Constraint(referenceClass = User.class)
	private Integer userId;

	/**
	 * 业务ID
	 * 被评价的业务对象ID（如商品ID、菜品ID、任务ID等）
	 */
	@ApiModelProperty("业务ID")
	private Integer businessId;

	/**
	 * 业务类型
	 * 1-菜品 2-旧物 3-任务
	 * 使用枚举类型区分不同业务
	 */
	@ApiModelProperty("业务类型 1-菜品 2-旧物 3-任务")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private BusinessType businessType;

	/**
	 * 评分
	 * 用户对业务对象的评分
	 */
	@ApiModelProperty("评分")
	private Double rating;

	/**
	 * 评价内容
	 * 用户填写的评价文字
	 */
	@ApiModelProperty("评价内容")
	private String content;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 用户昵称
	 * 扩展查询字段，关联用户表获取昵称
	 */
	@ExtendQuery(referenceClass = User.class, targetColumn = "nickname")
	private String userName;

	/**
	 * 用户头像
	 * 扩展查询字段，关联用户表获取头像，启用资源处理
	 */
	@ExtendQuery(referenceClass = User.class, targetColumn = "avatar", enableResource = true)
	private String userAvatar;

	/**
	 * 业务名称
	 * 非数据库字段，用于显示被评价对象名称
	 */
	@TableField(exist = false)
	private String name;

	/**
	 * 业务图片
	 * 非数据库字段，用于显示被评价对象图片
	 */
	@TableField(exist = false)
	private Attachment image;

	/**
	 * 业务类型枚举
	 * 定义评价对象的类型
	 */
	@Getter
	@AllArgsConstructor
	public enum BusinessType implements BaseEnum<BusinessType> {
		/**
		 * 菜品类型
		 */
		DISH(1, "菜品"),
		/**
		 * 旧物类型
		 */
		PRODUCT(2, "旧物"),
		/**
		 * 任务类型
		 */
		TASK(3, "任务"),
		;
		private final Integer value;
		private final String label;
	}
}